使用#define指令进行宏定义
宏定义的功能是用一个标识符来表示字符串,标识符称为宏名。在预编译处理时,对程序中出现的宏名,在程序中出现的宏名,都用宏定义中出现的字符串去代替。
#define 指令的形式是: #define 宏名 宏定义内容
凡是在程序中遇到“宏名”预编译处理程序就用这个“宏定义内容”原封不动的替换宏名,进行编译。C语言中宏定义可分为无参宏定义和有参宏定义两种。
Ⅰ )无参宏定义
无参宏定义的一般形式为:#define 宏名 宏定义内容
例如:#define PI 3.14159
表示将PI定义为3.14159。在程序中,凡是遇到宏名PI ,都使用数值 3.14159原封不动的替换PI 进行编译。
需要注意的是:用引号括起来的宏名,预处理程序不对其进行宏替换。例如:
#include<stdio.h>
#define Tom cat
int main()
{
printf("Tom");
printf("\n");
return 0;
}
程序运行时不会使用cat 去替换宏名Tom,编译器会将双引号中的Tom当作字符串处理,输出Tom。而如果在宏定义内容中出现引号,在编译时任然会原封不动的进行替换。例如:
#include<stdio.h>
#define Tom "cat"
int main()
{
printf("%s",Tom);
printf("\n");
return 0;
}
程序执行时遇到宏名Tom则会用宏定义内容“cat”进行替换输出cat 。
Ⅱ)有参宏定义
宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。对带参数的宏定义,在定义时不仅要宏展开,而且要用实参来代替形参。代参宏定义的一般形式为:
#define 宏名(形参表) 宏定义内容
代参宏调用的一般形式为:宏名(实参表);
例如:#define L(x) (x*x+2*x+x)
宏调用: y = L(5);在宏调用时,用实参5 去代替形参x,经预处理宏展开后的语句是:y =(5*5 + 2*5 +5) ;
使用宏定义时要注意以下几点;
(1)通常宏名都用大写字母表示,以便与程序中的变量相区别。从语法上来讲,不管是大写或小写,只要是合法的标识符都可以。
(2)通常将宏定义放在源程序文件开头。
(3)在宏展开时,只是原封不动的用宏定义内容替换宏名,别的什么计算、语法,编译预处理都不管。
(4)当宏名出现在字符串中时,预编译处理不对宏名进行宏展开,而是当作字符串处理。
使用#undef 终止宏定义####
#undef指令又叫终止宏指令,若要终止宏的作用域,可使用终止宏指令。#undef指令的一般形式是:
#undef 宏名
例如:
#define PI 3.14159
.
.
.
#undef PI
#undef PI终止了PI 的作用域。若没有设置终止宏指令,则宏名的作用域是从宏定义开始到源文件结束为止。
下面看一个简单的例子:
#include<iostream>
using namespace std;
#define PI 3.14159 //宏定义
#define AREA "圆面积为:"
int main()
{
float area1, area2;
int radius;
cout << "请输入圆半径: ";
cin >> radius;
area1 = PI *radius*radius;
#undef PI //终止宏定义
float pi = 3.14;
area2 = pi*radius*radius;
cout << AREA <<"area1="<< area1 << endl << AREA <<"area2="<< area2 << endl;
return 0;
}
运行结果:
在程序源文件开头进行宏定义:#define PI 3.14159在程序计算面积area1 后,终止了PI的宏定义。从新定义了float型变量PI,计算area2时使用了相同的变量名PI,程序运行结果并不相同,这是因为计算area1是使用的变量PI的值为宏定义的值3.14159,而计算area2时使用的是后来定义的float型变量值为3.14。这个例子可以帮我们简单理解宏定义和终止宏定义。